package com.wnxy.consumer.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yellow Docter
 * @date 2024 -04-18
 * @desc
 */
@RestController
@RequestMapping("test")
public class TestController {

    /**
     *  服务降级:返回默认的结果
     *  如果  id 小于10  程序异常
     *  如果  id  > 10  程序正常
     * @param id
     * @return
     * @throws Exception
     */
//    @GetMapping("find/{id}")
//    @HystrixCommand(fallbackMethod = "errorFallback")
//    public String findUserById(@PathVariable ("id") Integer id) throws Exception {
//        if (id < 10){
//            throw  new Exception("id不能小于10");
//        }
//        return "ok" + id;
//    }


    /**
     * 服务熔断: 为防止造成整个系统故障，从而采用的一种保护措施
     *     短时间内:出现故障 所有的请求都访问服务降级
     *           开启了熔断的时候、第五秒钟会判断 请求是否正常
     *               如果正常 关闭 服务熔断 正常访问
     *                   不正常、后面所有的请求都走熔断
     * @param id
     * @return
     */
    @GetMapping("find/{id}")
    @HystrixCommand(fallbackMethod = "errorFallback",commandProperties = {
            // 是否开启断路器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
            // 请求错误率大于 50% 就启动熔断器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
            // 默认10秒内访问接口达到20次，且错误率大于50%则打开断路器，触发熔断； 为了方便测试，这里修改请求数为10
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
            //断路多久以后开始尝试是否恢复，默认5s
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
    })
    public String findMemberById(@PathVariable("id")Integer id) {
        if (id<0) {
            throw new RuntimeException("id不能为负数");
        }
        return Thread.currentThread().getName() + " 调用成功";
    }

    //服务降级的方法
    public String errorFallback(@PathVariable("id")Integer id){
        return "我是服务降级的方法....";
    }

}
